home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Compilers⁄Interps / kevoSource / lists.c < prev    next >
Text File  |  1993-05-08  |  5KB  |  217 lines

  1. /* Kevo -- a prototype-based object-oriented language */
  2. /* (c) Antero Taivalsaari 1991-1993                   */
  3. /* Some parts (c) Antero Taivalsaari 1986-1988           */
  4. /* lists.c: Dynamically growing lists (needed in various places) */
  5.  
  6. #include "global.h"
  7.  
  8. /*--------------------------------------------------------------------------*/
  9. /* List management operations */
  10.  
  11. /* createList(): create a new empty list */
  12.  
  13. LIST* createList()
  14. {
  15.   /* Allocate object */
  16.   LIST*  newList = (LIST*)mymalloc(sizeof(LIST));
  17.   STORE* newStore  = createStore(DATAOFFSET+1); /* OOP cells plus one data cell */
  18.  
  19.     /* Set the fields needed for closure objects */
  20.     newList->mfa = newStore;                 /* Storage part for storing list data */
  21.     newList->logicalSize = 0;                  /* Initially list is empty */
  22.     newList->physicalSize = DATAOFFSET+1;    /* One slot is allocated, though */
  23.  
  24.     /* Make the list a full-fledged OOP object by storing */
  25.     /* the appropriate values to the two first slots */
  26.     newStore->efa = (int*)oContext;
  27.     newStore->pfa = (int*)dummyContext;
  28.  
  29.     return(newList);
  30. }
  31.  
  32.  
  33. /* deleteList(): delete an existing list */
  34.  
  35. void deleteList(list)
  36. LIST* list;
  37. {
  38.     free((STORE*)list->mfa);
  39.     free(list);
  40. }
  41.  
  42.  
  43. /* for debugging :
  44.  
  45. void printList(list)
  46. LIST* list;
  47. {
  48.   int* store = (int*)list->mfa;
  49.   int  i;
  50.   
  51.     printf("List: %d contents:\n\t", list);
  52.     for (i = DATAOFFSET; i < list->logicalSize+DATAOFFSET; i++) printf("%d ", store[i]);    
  53.     printf("\n");
  54. }
  55. */
  56.  
  57.  
  58. /* addToList(): add a new value to a list */
  59.  
  60. void addToList(list, value)
  61. LIST* list;
  62. void* value;
  63. {
  64.   int  index = list->logicalSize+DATAOFFSET; /* New items are added to the end */
  65.   int* store;
  66.  
  67.     /* For safety, zero values cannot be stored */
  68.     if (value == 0) return;
  69.  
  70.     /* Extend the list in chunks of four cells */
  71.     if (index >= list->physicalSize) {
  72.         list->mfa = (STORE*)myrealloc(list->mfa, (list->physicalSize+4)*CELL);
  73.         list->physicalSize += 4;
  74.     }
  75.     
  76.     store = (int*)list->mfa;
  77.     store[index] = (int)value;
  78.  
  79.     list->logicalSize++;
  80.     
  81. #ifdef DEBUG
  82.     printf("Adding %d.\n", value);
  83.     printList(list);
  84. #endif
  85. }
  86.  
  87.  
  88. /* condAddToList: conditionally add a new value to a list */
  89. /* (only if the value is not previously in the list) */
  90.  
  91. void condAddToList(list, value)
  92. LIST* list;
  93. void* value;
  94. {
  95.     if (!findInList(list, value)) addToList(list, value);
  96. }
  97.  
  98.  
  99. /* Remove a value from a list. 
  100.     Return true if the value is found (and removed) in the list, false otherwise. 
  101. */
  102.  
  103. int removeFromList(list, value)
  104. LIST* list;
  105. void* value;
  106. {
  107.     int index = findInList(list, value);
  108.     
  109.     if (index) {
  110.       int* store = (int*)list->mfa;
  111.     
  112.         index += DATAOFFSET;
  113.  
  114.         /* Move the rest of the list downwards */
  115.         while(index < list->logicalSize+DATAOFFSET) {
  116.             store[index-1] = store[index];
  117.             index++;
  118.         }
  119.     
  120.         list->logicalSize--;
  121.  
  122.         /* Store zero to the last (now unused) position just in case */
  123.         store[list->logicalSize+DATAOFFSET] = 0;
  124.  
  125. #ifdef DEBUG
  126.         printf("Removing %d.\n", value);
  127.         printList(list);
  128. #endif
  129.         return(TRUE);
  130.     }
  131.     else return(FALSE);
  132. }
  133.  
  134.  
  135. /* storeToList(): store a value to a list */
  136. /*
  137. void storeToList(list, index, value)
  138. LIST* list;
  139. int      index;
  140. void* value;
  141. {
  142.   int* store = (int*)list->mfa;
  143.  
  144.     index++;    Physical indexes begin from two, user indexes from one     
  145.  
  146.     if (index >= DATAOFFSET && index < list->logicalSize+DATAOFFSET)
  147.         store[index] = (int)value;
  148.     else {
  149.         fprintf(confile, "== Integrity error detected (out of bounds in LIST store) ==\n");
  150.         reportIntegrityError();
  151.         ownLongJmp();
  152.     }
  153. } */
  154.  
  155.  
  156. /* fetchFromList(): fetch a value from a list */
  157.  
  158. void* fetchFromList(list, index)
  159. LIST* list;
  160. int      index;
  161. {
  162.   int*  store = (int*)list->mfa;
  163.  
  164.     index++;    /* Physical indexes begin from two (DATAOFFSET), user indexes from one */    
  165.  
  166.     if (index >= DATAOFFSET && index < list->logicalSize+DATAOFFSET)
  167.         return((void*)store[index]);
  168.     else {
  169.         fprintf(confile, "== Integrity error detected (out of bounds in LIST fetch) ==\n");
  170.         reportIntegrityError();
  171.         ownLongJmp();
  172.     }
  173. }
  174.  
  175.  
  176. /* findInList(): check if a certain value can be found in a list */
  177.  
  178. int findInList(list, value)
  179. LIST* list;
  180. void* value;
  181. {
  182.   int   limit  = list->logicalSize+DATAOFFSET;
  183.   int*  store = (int*)list->mfa;
  184.   int   i;
  185.   
  186.     for (i = DATAOFFSET; i < limit; i++) {
  187.         if (store[i] == (int)value) return(i-1);
  188.     }
  189.     return(0);
  190. }
  191.  
  192.  
  193. /* emptyList(): erase an existing list to zero */
  194.  
  195. void emptyList(list)
  196. LIST* list;
  197. {
  198.     if (list->physicalSize != DATAOFFSET+1) {
  199.         list->mfa = (STORE*)myrealloc(list->mfa, (DATAOFFSET+1)*CELL);
  200.         list->physicalSize = DATAOFFSET+1;
  201.     }
  202.     list->logicalSize = 0;
  203. }
  204.  
  205.  
  206. /* optimizeList(): minimize the memory consumption of a list */
  207.  
  208. void optimizeList(list)
  209. LIST* list;
  210. {
  211.     if (list->physicalSize > list->logicalSize+DATAOFFSET) {
  212.         list->mfa = (STORE*)myrealloc(list->mfa, (list->logicalSize+DATAOFFSET)*CELL);
  213.         list->physicalSize = list->logicalSize+DATAOFFSET;
  214.     }
  215. }
  216.  
  217.